<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 14-6-5
 * Time: 下午11:27
 */
namespace ulue\libs\filter;


class Filter
{

    public $data;
    public $args;

    public function __construct($data=null, $args='int')
    {
        $this->data = $data;
        $this->args = $args;
    }

    /**
     * @param null $data
     * @param string|array $args
     * @param null $options
     * @return mixed|null
     */
    public function execute($data=null, $args='int', $options=null)
    {
        $data = !$data ? $this->data : $data;
        $args = !$args ? $this->args : $args;

        if ( empty($data) ) {
            return false;
        }

        if (is_array($data)) {
            return filter_var_array($data, (array) $args);
        }

        $args = $this->getTypes($args);

        return filter_var($data, constant($args), $options);
    }


    /**
     * 执行过滤
     * @param null $str
     * @param string $args
     * @param null $options
     * @return bool|mixed
     */
    public function doFilter($str=null, $args='int', $options=null)
    {
        $data = !$str ? $this->data : $str;
        $args = !$args ? $this->args : $args;

        if ( empty($data) ) {
            return false;
        }
        $args = $this->getFilterTypes($args);

        return filter_var($data, constant($args), $options);
    }

    /**
     * 执行验证
     * @param null $str
     * @param string $args
     * @param null $options
     * @return bool|mixed
     */
    public function doValidate($str=null, $args='int', $options=null)
    {
        $data = !$str ? $this->data : $str;
        $args = !$args ? $this->args : $args;

        if ( empty($data) ) {
            return false;
        }

        $args = $this->getValidateTypes($args);

        return filter_var($data, constant($args), $options);
    }

    public function getTypes($type='')
    {
        $typeArr = array_merge($this->getFilterTypes(), $this->getValidateTypes());

        return isset($typeArr[$type]) ? $typeArr[$type]: (!$type ? $typeArr : $type);
    }

    public function getFilterList()
    {
        return filter_list();
    }

    /**
     * 过滤类型
     * @param string $type
     * @return array|string
     */
    public function getFilterTypes($type='')
    {
        $typeArr = [
            'v_int'     => 'FILTER_VALIDATE_INT',          // 在指定的范围以整数验证值。
            'v_boolean' => 'FILTER_VALIDATE_BOOLEAN',      // 如果是 "1", "true", "on" 以及 "yes"，则返回 true，如果是 "0", "false", "off", "no" 以及 ""，则返回 false。否则返回 NULL。
            'v_float'   => 'FILTER_VALIDATE_FLOAT',        // 以浮点数验证值。
            'v_regexp'  => 'FILTER_VALIDATE_REGEXP',       // 根据 regexp，兼容 Perl 的正则表达式来验证值。
            'v_url'     => 'FILTER_VALIDATE_URL',          // 把值作为 URL 来验证。
            'v_email'   => 'FILTER_VALIDATE_EMAIL',        // 把值作为 e-mail 来验证。
            'v_ip'      => 'FILTER_VALIDATE_IP',           // 把值作为 IP 地址来验证
        ];

        return isset($typeArr[$type]) ? $typeArr[$type]: (!$type ? $typeArr : $type);
    }

    /**
     * 验证类型
     * @param string $type
     * @return array|string
     */
    public function getValidateTypes($type='')
    {
        $typeArr = [
            'callback' => 'FILTER_CALLBACK',               // 调用用户自定义函数来过滤数据。
            'string'   => 'FILTER_SANITIZE_STRING',        // 去除标签，去除或编码特殊字符。
            'stripped' => 'FILTER_SANITIZE_STRIPPED',      // "string" 过滤器的别名。
            'encoded'  => 'FILTER_SANITIZE_ENCODED',       // URL-encode 字符串，去除或编码特殊字符。
            'chars'    => 'FILTER_SANITIZE_SPECIAL_CHARS', // HTML 转义字符 '"<>& 以及 ASCII 值小于 32 的字符。
            'email'    => 'FILTER_SANITIZE_EMAIL',         // 删除所有字符，除了字母、数字以及 !#$%&'*+-/=?^_`{|}~@.[]
            'url'      => 'FILTER_SANITIZE_URL',           // 删除所有字符，除了字母、数字以及 $-_.+!*'(),{}|//^~[]`<>#%";/?:@&=
            'int'      => 'FILTER_SANITIZE_NUMBER_INT',    // 删除所有字符，除了数字和 +-
            'float'    => 'FILTER_SANITIZE_NUMBER_FLOAT',  // 删除所有字符，除了数字、+- 以及 .,eE。
            'quotes'   => 'FILTER_SANITIZE_MAGIC_QUOTES',  // 应用 addslashes()。
            'raw'      => 'FILTER_UNSAFE_RAW',             // 不进行任何过滤，去除或编码特殊字符。
        ];

        return isset($typeArr[$type]) ? $typeArr[$type]: (!$type ? $typeArr : $type);
    }

    // 过滤表单中的表达式 todo - thinkphp
    function filter_exp(&$value)
    {
        if (in_array( strtolower($value),array('exp','or') ) ){
            $value .= ' ';
        }
    }
}